package com.atguigu.mvc.handler;

import com.atguigu.mvc.entity.Employee;
import com.atguigu.mvc.entity.EmployeeParam;
import com.atguigu.mvc.entity.Student;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class Operation05Handler {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/param/one/name/one/value")
    public String oneNameOneValue(
            // 接收请求参数：
            // 第一步：handler 方法声明形参
            // 第二步：用 @RequestParam 注解标记这个形参
            // 第三步：在 @RequestParam 注解中指定请求参数的名称
            // 最终效果：SpringMVC 从请求中解析出来请求参数就会从这个形参位置传入
            // 补充一：请求参数名和形参名正好一致时，可以省略 @RequestParam 注解
            // 补充二：@RequestParam 注解的 required 属性
            //      可选值：true（默认值）表示指定请求参数必须提供。
            //      可选值：false 表示指定请求参数可有可无
            //      必须提供的参数没有提供时，会返回 400 响应状态码。
            //      Required String parameter 'userName' is not present
            // 补充三：@RequestParam 注解的 defaultValue 属性
            //      给请求参数设置默认值。
            //      此时如果浏览器没有提供请求参数且 required 属性设置为 true 可以使用默认值，不会报错。
            //  辨析：@RequestParam 注解和 @Param 注解的区别？
            @RequestParam(
                    value = "userName",
                    required = true,
                    defaultValue = "happyUser"
            )
                    String userName) {

        logger.debug("userName~~ = " + userName);

        return "target";
    }

    @RequestMapping("/param/one/name/multi/value")
    public String oneNameMultiValue(
            // 使用 @RequestParam 注解指定请求参数名称
            // 使用集合或数组类型接收多个值
            @RequestParam("team") List<String> teamList
            ) {

        for (String team : teamList) {
            logger.debug("team = " + team);
        }

        return "target";
    }

    @RequestMapping("/param/model")
    public String paramModel(

            // SpringMVC 检测到 handler 方法的形参是一个 POJO 时，
            // 会尝试将请求参数名称和 POJO 的 setXxx() 方法定义的属性进行匹配
            // 如果一致，则通过 setXxx() 方法注入
            Employee employee) {

        logger.debug(employee.toString());

        return "target";
    }

    @RequestMapping("/param/cascad")
    public String paramCascadeModel(Student student) {

        logger.debug(student.toString());

        return "target";
    }

    @RequestMapping("/param/list")
    public String paramList(@RequestParam("fruit") List<String> fruitList) {

        for (String fruit : fruitList) {
            logger.debug("fruit = " + fruit);
        }

        return "target";
    }

    @RequestMapping("/param/list/emp")
    public String paramListEmp(EmployeeParam employeeParam) {

        List<Employee> employeeList = employeeParam.getEmployeeList();

        for (Employee employee : employeeList) {
            logger.debug(employee.toString());
        }

        return "target";
    }
}
